6

背景

最近在做一个项目,给APP提供接口,用户认证机制采用了JWT(JSON Web Token)。项目开发完之后,给用户测试(删档测试),测试完之后,清空了数据库里的数据,之后又其他用户注册了。然后问题就来了,此时用户id为1的用户和以前为1的用户已经不是同一个用户了。但是APP内的token没清除,以前用户的id为1的用户进入APP后显示的是当前用户id为用户对应的信息。

解决方案

使用UUID,其中Java自带了uuid类(java.util.UUID),PHP可以直接使用Composer包ramsey/uuid

UUID简介

UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF)
的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。

UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。

在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等

其他坑

  1. 游戏服务器分区合区

  2. 别人很容易通过id猜测系统的数据

  3. 当你想迁移表结构到一个新环境的时候,默认自增值是从当前最大id下一个开始的,需手动改脚本

  4. 当我们对MySQL进行分表操作后,将不能依赖MySQL的自动增量来产生唯一ID了,因为数据已经分散到多个表中。  

总结

  • Uid等其他主建,尤其是能标示特定实体的,都不要自增主键

  • 主要的表尽量全部使用uuid

  • 一些不重要的表(日志、一次性活动),为了开发方便,可以采用自增id

相关链接

1. 自增id和uuid的对比讨论
2. UUID做主键,好还是不好?这是个问题。


rooy
47 声望8 粉丝